/***************************************************************************//**
 * @file     csa37f7x_usart.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-09-26 PM
 * @brief    
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
 * @attention
 *  硬件平台: CSA37F7X \n
 *  SDK版本： CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date        <th>Version  <th>Author    			<th>Description
 * <tr><td>2020-09-26  <td>1.0.0    <td>Chipsea MCU Group  <td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_USART_H__
#define __CSA37F7X_USART_H__

// Include external header file.
#include "csa37f7x.h"

#ifdef __cplusplus
extern "C" {
#endif


/** @addtogroup USART 串口(USART)
  USART 支持普通速度 UART，并支持自动流程控制。 USART 控制器对从外设收到的数据执行串到并
转换，对来自 CPU 的数据执行并到串的转换。<br>
###特性: 
    - 全双工，异步通信
    - 独立的接收/发送 16 字节 FIFO
    - 可编程的接收发送缓存触发级数
    - 支持 break 错误，帧错误，奇偶校验错误和接收/ 发送缓冲溢出检测功能
    - 完全可编程的串行接口特性
  @{
*/


/**
* @brief  串口校验模式选择
*/
typedef enum
{
    USART_PARITY_EVEN = 0x00,		 	/*!<偶校验 */ 
    USART_PARITY_ODD  = 0x01,		 	/*!<奇校验 */ 
}usart_parity_mode_t;

/**
* @brief  串口接收发送模式选择
*/
typedef enum
{
    USART_MODE_RX    = 0x01,		/*!<接收器 */
    USART_MODE_TX    = 0x02,		/*!<发送器 */
    USART_MODE_TX_RX = 0x03,		/*!<接收和发送器 */
}usart_mode_t;

/**
* @brief  串口有效电平反转引脚选择
*/
typedef enum
{
    USART_INVERSION_PIN_TX    = 0x01,	/*!<TX脚有效电平反向 */
    USART_INVERSION_PIN_RX    = 0x02,	/*!<RX脚有效电平反向 */
}usart_inversion_pin_t;

/**
* @brief  串口停止位选择
*/
typedef enum
{
    USART_STOP_BIT_1     = 0x00,		/*!<1个停止位 */
    USART_STOP_BIT_2     = 0x02,		/*!<2个停止位 */
    USART_STOP_BIT_1HALF = 0x03,        /*!<1.5个停止位 */	                         
}usart_stop_bit_t;

/**
* @brief  串口流控选择
*/
typedef enum
{
    USART_FLOW_CONTROL_NONE    = 0x00,	/*!<不开流控 */
    USART_FLOW_CONTROL_RTS     = 0x01,  /*!<打开RTS硬件流控 */
    USART_FLOW_CONTROL_CTS     = 0x02,	/*!<打开CTS硬件流控 */
    USART_FLOW_CONTROL_RTS_CTS = 0x03,  /*!<打开RTS和CTS硬件流控 */                               
}usart_flow_ctrl_t;

/**
* @brief  串口数据长度选择
*/
typedef enum
{
    USART_DATA_LENGTH_8BIT = 0x00,		/*!<8bit数字位*/
    USART_DATA_LENGTH_9BIT = 0x01,		/*!<9bit数字位*/
}usart_datalength_t;


/**
* @brief  串口初始化结构体定义
*/ 
typedef struct
{
    uint32_t usart_rate;       				/*!<配置波特率*/                                        
    usart_datalength_t data_width;       	/*!<配置数字位长度*/                                      
    usart_stop_bit_t stop_bits;        		/*!<配置停止位*/                               
    usart_parity_mode_t usart_parity;     	/*!<配置校验模式*/
    enable_state_t usart_parity_enable_ctrl;/*!<配置校验使能*/
    usart_mode_t usart_mode;       			/*!<配置串口收发模式*/          
    usart_flow_ctrl_t flow_control;     	/*!<配置流控模式*/                                                                                
} usart_config_t;

typedef enum
{
    USART_FLAG_RENACTF	  =    	  ((uint32_t)0x00400000),      	/*!< 串口接收使能有效标志 */
    USART_FLAG_TENACTF	  =    	  ((uint32_t)0x00200000),      	/*!< 串口发送使能有效标志 */
    USART_FLAG_WKUPF	  =    	  ((uint32_t)0x00100000),      	/*!< 串口深度睡眠模式唤醒标志 */
	USART_FLAG_CMF        =    	  ((uint32_t)0x00020000),      	/*!< 串口字符匹配标志 */
	USART_FLAG_ROTF       =       ((uint32_t)0x00000800),     	/*!< 串口接收超时标志 */
    USART_FLAG_TCE        =       ((uint32_t)0x00000080),     	/*!< 串口发送缓冲寄存器空标志 */
	USART_FLAG_TCF        =       ((uint32_t)0x00000040),     	/*!< 串口发送完毕标志 */
	USART_FLAG_RXNE       =       ((uint32_t)0x00000020),     	/*!< 串口接收数据寄存器非空标志 */
	USART_FLAG_IDLE       =       ((uint32_t)0x00000010),    	/*!< 串口检测到空闲标志 */
	USART_FLAG_OVRERRF    =       ((uint32_t)0x00000008),   	/*!< 串口溢出错误标志 */
	USART_FLAG_NF         =       ((uint32_t)0x00000004),       /*!< 串口START位噪声检测标志 */
	USART_FLAG_FERRF      =       ((uint32_t)0x00000002),    	/*!< 串口帧错误标志 */
	USART_FLAG_PERRF      =       ((uint32_t)0x00000001),    	/*!< 串口校验错误标志 */
	USART_FLAG_CTSIF      =       ((uint32_t)0x00000200),    	/*!< 串口CTS(清除发送)中断标志 */
	USART_FLAG_BSYF       =       ((uint32_t)0x00010000),     	/*!< 串口忙标志 */
}usart_flag_t; 


typedef enum
{
    USART_INT_CM          =       ((uint32_t)0x0011010E), /*!< 串口字符匹配中断 */
    USART_INT_ENDBLK      =       ((uint32_t)0x000C011B), /*!< 串口块结束中断 */
    USART_INT_ROT         =       ((uint32_t)0x000B011A), /*!< 串口接收超时中断 */
    USART_INT_PERR        =       ((uint32_t)0x00000108), /*!< 串口校验错误中断 */
    USART_INT_TXE         =       ((uint32_t)0x00070107), /*!< 串口发送数据寄存器空中断 */
    USART_INT_TC          =       ((uint32_t)0x00060106), /*!< 串口发送完毕中断 */
    USART_INT_RXNE        =       ((uint32_t)0x00050105), /*!< 串口接收寄存器非空中断 */
    USART_INT_LINBK       =       ((uint32_t)0x00080206), /*!< 串口LIN断开信号检测中断 */
    USART_INT_CTS         =       ((uint32_t)0x0009030A), /*!< 串口USART CTS中断 */
    USART_INT_ERR         =       ((uint32_t)0x00000300), /*!< 串口帧错误中断 */                    
} usart_int_t;

/**@brief		    串口初始化
 *
 * @param[in]	    ptr_usart_config     串口配置结构体
 * @return		    无
*/
void usart_init(usart_config_t* ptr_usart_config);

/**@brief		    串口使能
 *
 * @param[in]	    enable_flag     串口使能位配置
 *					DISABLE			串口关闭，低功耗模式
 *					ENABLE			串口开启
 * @return		    无
*/
void usart_enable_ctrl( enable_state_t enable_flag);

/**@brief		    串口收发使能
 * @param[in]		direction			串口接收发送选择
 * 					USART_MODE_RX		接收使能
 *					USART_MODE_TX		发送使能
 *					USART_MODE_TX_RX	发送接收均使能
 * @param[in]	    enable_flag     	串口收发使能位配置
 * @return		    无
*/
void usart_direction_enable_ctrl(usart_mode_t direction, enable_state_t enable_flag);



/**@brief		    串口过采样使能
 *
 * @param[in]	    enable_flag     过采样使能配置
 *					DISABLE			16倍过采样
 *					ENABLE			8倍过采样
 * @return		    无
*/
void usart_oversampling_enable_ctrl(enable_state_t enable_flag);

/**@brief		    串口单次采样方式使能
 *
 * @param[in]	    enable_flag     单次采样方式使能配置
 *					DISABLE			三次采样方式
 *					ENABLE			单次采样方式
 * @return		    无
*/
void usart_sample_method_enable_ctrl(enable_state_t enable_flag);

/**@brief		    串口高位优先使能
 *
 * @param[in]	    enable_flag     高位优先使能配置
 *					DISABLE			数据在发送和接收的时候，采用起始位在前，后面跟着第0位的顺序
 *					ENABLE			数据在发送和接收的时候，采用起始位在前，后面跟着最高位（位7或者位8）的顺序
 * @return		    无
*/
void usart_msb_first_enable_ctrl(enable_state_t enable_flag);

/**@brief		    串口二进制数据反向使能
 *
 * @param[in]	    enable_flag     二进制数据反向使能配置
 *					DISABLE			数据在发送和接收的时候，采用正/直接逻辑（1=H，0=L）
 *					ENABLE			数据在发送和接收的时候，采用负/反向逻辑（1=L，0=H）
 * @return		    无
*/
void usart_data_reverse_enable_ctrl(enable_state_t enable_flag);


/**@brief		    串口TX/RX脚有效电平反向使能
 * @param[in]		usart_invpin			串口有效电平反转脚选择
 *					USART_INVERSION_PIN_TX	TX脚有效电平反向 	
 *					USART_INVERSION_PIN_RX	RX脚有效电平反向
 * @param[in]	    enable_flag     		串口TX/RX脚有效电平反向使能配置
 *					DISABLE					TX/RX脚信号工作于标准逻辑电平（VDD=1/idle，Gnd=0/mark）
 *					ENABLE					TX/RX脚信号被反向（VDD=0/mark，Gnd=1/idle）
 * @return		    无
*/
void usart_pin_reverse_enable_ctrl(usart_inversion_pin_t usart_invpin, enable_state_t enable_flag);

/**@brief		    串口交换TX/RX引脚使能
 *
 * @param[in]	    enable_flag     交换TX/RX引脚使能配置
 *					DISABLE			TX/RX引脚按照标准引脚的分配来使用
 *					ENABLE			TX/RX的引脚功能交换使用
 * @return		    无
*/
void usart_pin_swap_enable_ctrl(enable_state_t enable_flag);

/**@brief		    串口接收超时检测功能使能
 *
 * @param[in]	    enable_flag     接收超时检测功能使能配置
 *					DISABLE			接收超时检测功能关闭
 *					ENABLE			接收超时检测功能开启
 * @return		    无
*/
void usart_recv_overtime_enable_ctrl(enable_state_t enable_flag);
  
/**@brief		    串口接收超时时间配置
 *
 * @param[in]	    value     串口接收超时时间,范围0~0x00FFFFFF
 * @return		    无
*/
void usart_recv_overtime_set(uint32_t value);

/**@brief			串口数据发送
 *
 * @param[in]		value	  串口数据发送值,范围0~0x01FF
 * @return			无
*/
void usart_data_send(uint16_t value);

/**@brief			串口数据接收
 *
 * @return			返回串口数据接收值,范围0~0x01FF
*/
uint16_t usart_data_receive(void);
	
/**@brief			串口中断配置
 *
 * @param[in]		set_value	  		使能中断配置选择
 *					USART_INT_CM		串口字符匹配中断
 *					USART_INT_ROT		串口接收超时中断
 *					USART_INT_CTS		串口CTS中断
 *					USART_INT_TC		串口发送完毕中断
 *					USART_INT_TXE		串口发送数据寄存器空中断
 *					USART_INT_RXNE		串口接收寄存器非空中断
 *					USART_INT_ERR		串口帧错误中断
 *					USART_INT_PERR		串口校验错误中断
 *					USART_INT_ENDBLK	串口块结束中断
 * @param[in]	    enable_flag     	串口中断使能配置
 *					DISABLE				禁用配置的中断
 *					ENABLE				使能配置的中断
 * @return			无
*/
void usart_interrupt_config(uint32_t set_value, enable_state_t enable_flag);

/**@brief			串口标志状态查询
 *
 * @param[in]		flag	  			挂起标志选择
 *                  USART_FLAG_RENACTF	串口接收使能有效标志
 *                  USART_FLAG_TENACTF	串口发送使能有效标志
 *                  USART_FLAG_WKUPF	串口深度睡眠模式唤醒标志
 *					USART_FLAG_CMF		串口字符匹配标志
 *					USART_FLAG_ROTF		串口接收超时标志
 *					USART_FLAG_CTSIF	串口CTS中断标志
 *					USART_FLAG_TCF		串口发送完毕标志
 *					USART_FLAG_IDLE		串口检测到空闲标志
 *					USART_FLAG_OVRERRF	串口溢出错误标志
 *					USART_FLAG_RXNE		串口接收数据寄存器非空标志
 *					USART_FLAG_NF		串口START位噪声检测标志
 *					USART_FLAG_FERRF	串口帧错误标志
 *					USART_FLAG_PERRF	串口校验错误标志
 *					USART_FLAG_BSYF		串口忙标志
 * @return			返回查询标志的状态  		 	1：置位，0：复位
*/
bit_status_t usart_flag_status_get(uint32_t flag);

/**@brief			串口中断标志清除
 *
 * @param[in]		flag	  			挂起标志选择
 *					USART_FLAG_CMF		串口字符匹配标志
 *					USART_FLAG_ROTF		串口接收超时标志
 *					USART_FLAG_CTSIF	串口CTS中断标志
 *					USART_FLAG_TCF		串口发送完毕标志
 *					USART_FLAG_IDLE		串口检测到空闲标志
 *					USART_FLAG_OVRERRF	串口溢出错误标志
 *					USART_FLAG_NF		串口START位噪声检测标志
 *					USART_FLAG_FERRF	串口帧错误标志
 *					USART_FLAG_PERRF	串口校验错误标志
 * @return			无
*/
void usart_flag_clear(uint32_t flag);
	
/**@brief			串口中断使能状态查询
 *
 * @param[in]		set_value	  		使能中断配置选择
 *					USART_INT_CM		串口字符匹配中断
 *					USART_INT_ROT		串口接收超时中断
 *					USART_INT_CTS		串口CTS中断
 *					USART_INT_TC		串口发送完毕中断
 *					USART_INT_TXE		串口发送数据寄存器空中断
 *					USART_INT_RXNE		串口接收寄存器非空中断
 *					USART_INT_ERR		串口帧错误中断
 *					USART_INT_PERR		串口校验错误中断
 *					USART_INT_ENDBLK	串口块结束中断
 * @return			返回串口中断使能状态	0：禁用，1：使能					
*/
bit_status_t usart_interrupt_status_get(uint32_t set_value);

/**@brief			串口中断标志清零
 *
 * @param[in]		set_value	  		使能中断配置选择
 *					USART_INT_CM		串口字符匹配中断
 *					USART_INT_ROT		串口接收超时中断
 *					USART_INT_CTS		串口CTS中断
 *					USART_INT_TC		串口发送完毕中断
 *					USART_INT_TXE		串口发送数据寄存器空中断
 *					USART_INT_RXNE		串口接收寄存器非空中断
 *					USART_INT_ERR		串口帧错误中断
 *					USART_INT_PERR		串口校验错误中断
 *					USART_INT_ENDBLK	串口块结束中断
 * @return			无				
*/
void usart_interrupt_bit_clear(uint32_t set_value);

/*@}*/ /* end of group USART */


#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_USART_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/

